package com.tianquan.miracle.aop;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;

/**
 * @author tianquan
 * @date 2024-10-08 上午10:34
 * @description JoinPoint接口代表程序执行过程中的一个连接点
 * 在面向切面编程(AOP)中，连接点是程序执行的特定点，例如方法的调用或异常的抛出
 * 此接口主要提供了执行目标方法、获取目标方法及其相关元数据的功能
 */
public interface JoinPoint {

    /**
     * 执行目标方法
     * 此方法允许在当前连接点处继续执行程序
     *
     * @return 目标方法执行后的返回值
     * @throws Throwable 如果目标方法执行过程中抛出异常
     */
    Object proceed() throws Throwable;

    /**
     * 执行目标方法，并传入参数
     * 此方法允许在当前连接点处继续执行程序，并可以覆盖目标方法的参数
     *
     * @param args 传递给目标方法的参数数组
     * @return 目标方法执行后的返回值
     * @throws Throwable 如果目标方法执行过程中抛出异常
     */
    Object proceed(Object[] args) throws Throwable;

    /**
     * 获取目标方法
     * 此方法返回当前连接点关联的目标对象，可以是被代理的对象实例
     *
     * @return 当前连接点关联的目标对象
     */
    Object getTarget();

    /**
     * 获取目标方法参数
     * 此方法返回目标方法的参数数组，反映了方法调用时传递的实际参数值
     *
     * @return 目标方法的参数数组
     */
    Object[] getArgs();

    /**
     * 获取目标方法的注解
     * 此方法返回目标方法上声明的所有注解，允许访问方法的元数据
     *
     * @return 目标方法上的注解数组
     */
    Annotation[] getAnnotations();

    /**
     * 获取目标方法
     * 此方法返回当前连接点关联的目标方法的反射对象，可以用来获取方法的详细信息
     *
     * @return 当前连接点关联的目标方法的反射对象
     */
    Method getMethod();
}

